home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / tcppack / tcppackb.lzh / src / libnetwork / search_ti_entry.c < prev    next >
C/C++ Source or Header  |  1995-11-07  |  6KB  |  323 lines

  1. /*
  2.  * search_ti_entry.c
  3.  *
  4.  * thanks libc d_import.c
  5.  */
  6.  
  7. #include<stddef.h>
  8. #include<string.h>
  9. #define __DOS_INLINE__
  10. #include<sys/dos.h>
  11. #include"tcpipdrv.h"
  12.  
  13. /* structs */
  14. struct _memimg {
  15.     struct _mep mep;
  16.     struct _psp psp;
  17.     char prog[0];
  18. };
  19.  
  20. /* Macros */
  21. #define _GETMP(psp)   ((char *) (psp) - sizeof (struct _mep))
  22. #define _ISKEEPMEM(x) (((int) (x) & 0xff000000) == 0xff000000)
  23.  
  24. /* file scope variables */
  25. static _ti_func func;
  26. static int failed;
  27. static int super_p;
  28. #ifdef FAST_API
  29. static int trap_no = -2;
  30. #endif
  31.  
  32. /* file scope functions */
  33. static void * search_ti_sub (void);
  34. static long _ti_entry (long, void *);
  35. static long _ti_entry_super (long, void *);
  36. #ifdef FAST_API
  37. static long _ti_entry_trap_0 (long, void *);
  38. static long _ti_entry_trap_1 (long, void *);
  39. static long _ti_entry_trap_2 (long, void *);
  40. static long _ti_entry_trap_3 (long, void *);
  41. static long _ti_entry_trap_4 (long, void *);
  42. static long _ti_entry_trap_5 (long, void *);
  43. static long _ti_entry_trap_6 (long, void *);
  44. static long _ti_entry_trap_7 (long, void *);
  45.  
  46. typedef long (*trap_func) (long, void *);
  47. static trap_func trap_funcs[8] =
  48. {
  49.   _ti_entry_trap_0,
  50.   _ti_entry_trap_1,
  51.   _ti_entry_trap_2,
  52.   _ti_entry_trap_3,
  53.   _ti_entry_trap_4,
  54.   _ti_entry_trap_5,
  55.   _ti_entry_trap_6,
  56.   _ti_entry_trap_7,
  57. };
  58. #endif
  59.  
  60. /*
  61. **
  62. */
  63. _ti_func
  64. search_ti_entry (void)
  65. {
  66.   long ssp;
  67.  
  68.   if (failed)
  69.     return NULL;
  70.  
  71.   if (!func)
  72.     {
  73.       super_p = 0;
  74.       ssp = _dos_super (0);
  75.       func = search_ti_sub ();
  76.       if (ssp > 0)
  77.     _dos_super (ssp);
  78.  
  79.       if (_dos_memcpy (func - 8, func - 8, 1))
  80.     super_p = 1;
  81.     }
  82.  
  83.   if (!func)
  84.     {
  85.       failed = 1;
  86.       return func;
  87.     }
  88.  
  89. #ifdef FAST_API
  90.   if (trap_no >= 0 && trap_no <= 7)
  91.     return trap_funcs[trap_no];
  92.   else if (trap_no == -2)
  93.     {
  94.       trap_no = _ti_entry (-1, NULL);
  95.       if (trap_no >= 0 && trap_no <= 7)
  96.     return trap_funcs[trap_no];
  97.       else
  98.     trap_no = -1;
  99.     }
  100. #endif
  101.  
  102.   if (super_p)
  103.     return _ti_entry_super;
  104.   else
  105.     return _ti_entry;
  106. }
  107.  
  108. /*
  109. **
  110. */
  111. void *
  112. search_ti_sub (void)
  113. {
  114.     void *addr;
  115.     struct _memimg *ps;
  116.     struct _psp *psp;
  117.  
  118.     psp = _dos_getpdb ();
  119.     addr = 0;
  120.  
  121.     ps = (struct _memimg *) _GETMP (psp);
  122.  
  123.     while (ps = ps->mep.prev_mp)
  124.       {
  125.     if (_ISKEEPMEM (ps->mep.parent_mp))
  126.       {
  127.         if (!strncmp (ps->prog, "TCP/IP", 6))
  128.           {
  129.         addr = ps->prog + 8;
  130.         break;
  131.           }
  132.       }
  133.       }
  134.  
  135.     /* addr é≡ò╘é╖ */
  136.     return addr;
  137. }
  138.  
  139. /*
  140. **
  141. */
  142. static long
  143. _ti_entry (long arg1, void *arg2)
  144. {
  145.   register long result asm ("d0");
  146.  
  147.   asm volatile ("move.l\t%2,a0\n"
  148.         "\tmove.l\t%1,d0\n"
  149.         "\tmove.l\t%3,a1\n"
  150.         "\tjsr\t(a1)\n"
  151.         : "d=" (result)
  152.         : "g" (arg1), "g" (arg2), "g" (func)
  153.         : "d0", "d1", "d2", "a0", "a1", "a2");
  154.  
  155.   return result;
  156. }
  157.  
  158. /*
  159. **
  160. */
  161. static long
  162. _ti_entry_super (long arg1, void *arg2)
  163. {
  164.   register long result asm ("d0");
  165.  
  166.   asm volatile ("move.l\t%2,a0\n"
  167.         "\tmove.l\t%1,d0\n"
  168.         "\tmove.l\t%3,-(sp)\n"
  169.         "\tDOS\tSUPER_JSR\n"
  170.         "\taddq.l\t#4,sp"
  171.         : "d=" (result)
  172.         : "g" (arg1), "g" (arg2), "g" (func)
  173.         : "d0", "d1", "d2", "a0", "a1", "a2");
  174.  
  175.   return result;
  176. }
  177.  
  178. #ifdef FAST_API
  179. /*
  180. **
  181. */
  182. static long
  183. _ti_entry_trap_0 (long arg1, void *arg2)
  184. {
  185.   register long result asm ("d0");
  186.  
  187.   asm volatile ("move.l\t%2,a0\n"
  188.         "\tmove.l\t%1,d0\n"
  189.         "\ttrap\t#0\n"
  190.         : "d=" (result)
  191.         : "g" (arg1), "g" (arg2)
  192.         : "d0", "d1", "d2", "a0", "a1", "a2");
  193.  
  194.   return result;
  195. }
  196.  
  197. /*
  198. **
  199. */
  200. static long
  201. _ti_entry_trap_1 (long arg1, void *arg2)
  202. {
  203.   register long result asm ("d0");
  204.  
  205.   asm volatile ("move.l\t%2,a0\n"
  206.         "\tmove.l\t%1,d0\n"
  207.         "\ttrap\t#1\n"
  208.         : "d=" (result)
  209.         : "g" (arg1), "g" (arg2)
  210.         : "d0", "d1", "d2", "a0", "a1", "a2");
  211.  
  212.   return result;
  213. }
  214.  
  215. /*
  216. **
  217. */
  218. static long
  219. _ti_entry_trap_2 (long arg1, void *arg2)
  220. {
  221.   register long result asm ("d0");
  222.  
  223.   asm volatile ("move.l\t%2,a0\n"
  224.         "\tmove.l\t%1,d0\n"
  225.         "\ttrap\t#2\n"
  226.         : "d=" (result)
  227.         : "g" (arg1), "g" (arg2)
  228.         : "d0", "d1", "d2", "a0", "a1", "a2");
  229.  
  230.   return result;
  231. }
  232.  
  233. /*
  234. **
  235. */
  236. static long
  237. _ti_entry_trap_3 (long arg1, void *arg2)
  238. {
  239.   register long result asm ("d0");
  240.  
  241.   asm volatile ("move.l\t%2,a0\n"
  242.         "\tmove.l\t%1,d0\n"
  243.         "\ttrap\t#3\n"
  244.         : "d=" (result)
  245.         : "g" (arg1), "g" (arg2)
  246.         : "d0", "d1", "d2", "a0", "a1", "a2");
  247.  
  248.   return result;
  249. }
  250.  
  251. /*
  252. **
  253. */
  254. static long
  255. _ti_entry_trap_4 (long arg1, void *arg2)
  256. {
  257.   register long result asm ("d0");
  258.  
  259.   asm volatile ("move.l\t%2,a0\n"
  260.         "\tmove.l\t%1,d0\n"
  261.         "\ttrap\t#4\n"
  262.         : "d=" (result)
  263.         : "g" (arg1), "g" (arg2)
  264.         : "d0", "d1", "d2", "a0", "a1", "a2");
  265.  
  266.   return result;
  267. }
  268.  
  269. /*
  270. **
  271. */
  272. static long
  273. _ti_entry_trap_5 (long arg1, void *arg2)
  274. {
  275.   register long result asm ("d0");
  276.  
  277.   asm volatile ("move.l\t%2,a0\n"
  278.         "\tmove.l\t%1,d0\n"
  279.         "\ttrap\t#5\n"
  280.         : "d=" (result)
  281.         : "g" (arg1), "g" (arg2)
  282.         : "d0", "d1", "d2", "a0", "a1", "a2");
  283.  
  284.   return result;
  285. }
  286.  
  287. /*
  288. **
  289. */
  290. static long
  291. _ti_entry_trap_6 (long arg1, void *arg2)
  292. {
  293.   register long result asm ("d0");
  294.  
  295.   asm volatile ("move.l\t%2,a0\n"
  296.         "\tmove.l\t%1,d0\n"
  297.         "\ttrap\t#6\n"
  298.         : "d=" (result)
  299.         : "g" (arg1), "g" (arg2)
  300.         : "d0", "d1", "d2", "a0", "a1", "a2");
  301.  
  302.   return result;
  303. }
  304.  
  305. /*
  306. **
  307. */
  308. static long
  309. _ti_entry_trap_7 (long arg1, void *arg2)
  310. {
  311.   register long result asm ("d0");
  312.  
  313.   asm volatile ("move.l\t%2,a0\n"
  314.         "\tmove.l\t%1,d0\n"
  315.         "\ttrap\t#7\n"
  316.         : "d=" (result)
  317.         : "g" (arg1), "g" (arg2)
  318.         : "d0", "d1", "d2", "a0", "a1", "a2");
  319.  
  320.   return result;
  321. }
  322. #endif
  323.